/*
 * Copyright (c) 2009 LastFM.Desktop Anton Pavlik.
 * All Rights Reserved.
 * 
 * You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, 
 * with or without modifications, and in Source or Object form, provided that You meet the following 
 * conditions:
 * 1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
 *
 * 2. You must cause any modified files to carry prominent notices stating that You changed the files; 
 * and
 *
 * 3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, 
 * patent, trademark, and attribution notices from the Source form of the Work, excluding those notices 
 * that do not pertain to any part of the Derivative Works.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * You may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 * http://www.apache.org/licenses/LICENSE-2.0 
 *
 * Unless required by applicable law or agreed to in writing, Licensor provides the Work 
 * (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR 
 * CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties 
 * or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. 
 * YOU ARE SOLELY RESPONSIBLE FOR DETERMINING THE APPROPRIATENESS OF USING OR REDISTRIBUTING THE WORK
 * AND ASSUME ANY RISKS ASSOCIATED WITH YOUR EXERCISE OF PERMISSIONS UNDER THIS LICENSE. 
 */
package org.shake.lastfm.net;

import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.SimpleHttpConnectionManager;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class HttpEngine
{
    /**/
//    private static HttpEngine engineInstance;

    private final Log log = LogFactory.getLog(HttpEngine.class);
    private HttpClient client;

    private HttpEngine()
    {
        this.client = new HttpClient( new SimpleHttpConnectionManager(true) );
    }

    public synchronized static HttpEngine getInstance()
    {
//        if (engineInstance == null)
//        {
//            engineInstance = new HttpEngine();
//        }

        return new HttpEngine();
//        return engineInstance;
    }
    
    private synchronized HttpClient createHttpClient()
    {
        return this.client;
    }
    
    public String executeGetString(final String url) throws HttpEngineException, IllegalStateException
    {
        GetMethod getMethod = execute(url);

        try
        {
            return getMethod.getResponseBodyAsString();
        } catch (IOException e)
        {
            throw new HttpEngineException("Could not get respose from URL = <"+url+"> " + e.getMessage());
        }
    }

    public InputStream executeGet(final String url) throws HttpEngineException, IllegalStateException
    {
        GetMethod getMethod = execute(url);

        try
        {
            return getMethod.getResponseBodyAsStream();
        } catch (IOException e)
        {
            throw new HttpEngineException("Could not get respose from URL = <"+url+"> " + e.getMessage());
        }
    }

    private GetMethod execute(final String url) throws HttpEngineException
    {
        GetMethod getMethod = new GetMethod(url);
        try
        {
            createHttpClient().executeMethod(getMethod);
            log.info("Executed: GET " + url);
        } 
        catch (HttpException e)
        {
            throw new HttpEngineException("Could not execute GET URL = <"+url+"> " + e.getMessage()); 
        } 
        catch (IOException e)
        {
            throw new HttpEngineException("Could not execute GET URL = <"+url+"> " + e.getMessage());
        }

        if (getMethod.getStatusCode() != HttpStatus.SC_OK)
        {
            log.error("HTTP GET status error. Message: "+getMethod.getStatusLine()+". Expected status " + HttpStatus.SC_OK);
            throw new HttpEngineException("");
        }
        return getMethod;
    }

}